#ifndef LOGGER_H
#define LOGGER_H

#include <QDebug>
#include <QString>
#include "log_global.h"
#include "loginfo.h"
#include "loginstance.h"

class LoggerPrivate;
class LOGSHARED_EXPORT Logger
{
public:
    /************************************************
     * 功能：构造函数
     * 输入参数：
     *      pInfo -- 日志文件文件配置
     ************************************************/
    Logger( Logging::RotateConfigInfo* pInfo );

    /************************************************
     * 功能：构造函数
     * 输入参数：
     *      pInfo -- 日志文件文件配置
     ************************************************/
    Logger( Logging::TimeConfigInfo* pInfo );

    /************************************************
     * 功能：析构函数
     ************************************************/
    ~Logger();

    /************************************************
     * 功能：获取记录句柄
     * 输入参数：
     *      eLevel -- 等级
     * 返回：对应的句柄
     ************************************************/
    LogInstance log( Logging::LogLevel eLevel = Logging::DEBUG );

    /************************************************
     * 功能：trace记录
     * 返回：trace句柄引用
     ************************************************/
    LogInstance trace();

    /************************************************
     * 功能：debug记录
     * 返回：debug句柄
     ************************************************/
    LogInstance debug();

    /************************************************
     * 功能：info记录
     * 返回：info句柄
     ************************************************/
    LogInstance info();

    /************************************************
     * 功能：warn记录
     * 返回：warn句柄
     ************************************************/
    LogInstance warn();

    /************************************************
     * 功能：error记录
     * 返回：error句柄
     ************************************************/
    LogInstance error();

    /************************************************
     * 功能：fatal记录
     * 返回：fatal句柄
     ************************************************/
    LogInstance fatal();

    /************************************************
     * 功能：获取日志等级
     * 返回：日志等级
     ************************************************/
    Logging::LogLevel logLevel() const;

    /************************************************
     * 功能：设置日志等级
     * 输入参数：
     *       eLogLevel -- 日志等级
     ************************************************/
    void setLogLevel( Logging::LogLevel eLogLevel );

    /************************************************
     * 功能：使能调试输出
     * 输入参数：
     *       eLogLevel -- 调试输出的日志等级
     ************************************************/
    void enableDebugOutput( Logging::LogLevel eLogLevel );

    /*************************************************
    功能： 将日志输出到接收日志的自定义对象
    输入参数： receiver：接收日志消息对象指针
              member：响应日志消息槽函数，槽函数参数格式为(QString, int)：QString - 日志内容 int - 日志级别
    *************************************************************/
    void addReceiver(QObject *receiver, const char *member);
private:
    Logger(const Logger&);            // not available
    Logger& operator=(const Logger&); // not available
private:
    LoggerPrivate* d;
};

#endif // LOGGER_H
